package edu.zhangxu.service;

import edu.zhangxu.dao.ProblemDao;
import edu.zhangxu.dao.ProblemDaoImp;
import edu.zhangxu.pojo.Problem;
import edu.zhangxu.util.JDBCUtils;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.*;
import java.util.LinkedList;
import java.util.List;

/*
 1.前端的代码编辑功能怎么实现的？
 使用的开源Vue组件，起初是用CodeMirror，AceEditor，对Vue3的支持不太好，导入后报错，然后发现AceEditor是对Brace（Web端在线代码编辑器）
 的组件封装（重量级），然后找到了一个对Brace进行轻量级封装的组件，满足了项目的要求。
 2.如何做的数据库操作代码的优化？
 首先是在每个需要对数据库进行操作的Servlet中都要执行JDBC的那一套流程，注册驱动，建立连接，创建数据库操作对象，访问数据库，执行sql语句，
 处理返回结果集，断开数据库连接，步骤繁琐效率低。优化：1.使用数据库连接池技术，具体的实现是使用开源的DBCP，连接池技术尽可能多地重用了
 消耗内存地资源，大大节省了内存，提高了服务器操作数据库的效率。2.使用ORM框架，实现程序对象到关系数据库数据的映射，对数据库的增删改查
 抽象成数据访问接口，接口中定义了应用程序中将会用到的所有事务方法。当应用程序需要和数据源进行交互的时候使用这个接口，并且编写一个单独
 的类来实现这个接口的数据存储。例如有一个数据库有一个Problem表，业务层不会直接使用SQL语句操作这张表，而是通过一个接口去操作，接口的实
 现由一个ProblemDapImp的类来实现，这个类会继承BaseDao，BaseDao中实现了数据库的增删改查的通过操作，ProblemDapImp在此基础上实现适用于
 对Problem表的操作。
 3.后端怎么产生JSON数据的？
 使用Json-lib
 4.为什么要对前端的axios进行封装？
 如果许多地方都直接使用axios的话当axios出现bug或不再维护的话就需要对所有使用axios的地方进行修改，工作量大，对axios进行封装，只使用当
 封装后的axios当需要对axios进行修改时只需要修改一个地方。
 5.如何上线部署的？
 //mysql没启动怎么不提示？
 */

public class ProblemSetService extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        resp.setHeader("Access-Control-Allow-Origin", "*"); // 允许跨域访问

        List<Problem> problemSet = null;
        Connection con = null;
        ProblemDao dao = new ProblemDaoImp();
        JSONArray ja = null;
        try {
            con = JDBCUtils.getConnection();
            problemSet = dao.getSimpleAll(con);
            for(Problem problem : problemSet) {
                problem.calcPassRate();
            }
            ja = JSONArray.fromObject(problemSet);
        } catch (Exception e) {
            e.printStackTrace();
            ja = JSONArray.fromObject(e);
        } finally {
            JDBCUtils.closeConnection(con, null);
            resp.getWriter().print(ja);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
